package com.jcdd.controller;


import cn.dev33.satoken.stp.StpUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.json.JSONObject;
import cn.hutool.json.JSONUtil;
import com.jcdd.constant.YjyStore;
import com.jcdd.mapper.UserMapper;
import com.jcdd.mapper.WxUserMapper;
import com.jcdd.object.db.User;
import com.jcdd.object.db.WxUser;
import com.jcdd.object.front.Result;
import lombok.extern.slf4j.Slf4j;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.client.RestTemplate;

import java.time.LocalDateTime;


@RestController
@RequestMapping("/wx")
@Slf4j
public class WxController {

    @Autowired
    private RestTemplate restTemplate;

    @Autowired
    private UserMapper userMapper;

    @Autowired
    private WxUserMapper wxUserMapper;


    /**
     * @param js_code 微信小程序端 wx.login 返回来的临时 js_code
     * @return 返回前端要的用户id;  token 由 Set-Cookie响应头返回,样式如下
     * Set-Cookie: satoken=a81800a1-d2c8-4904-93e5-b6e81237ee18;
     */
    @GetMapping("/login")
    @Transactional  // 添加事务管理
    public Result login(String js_code) {
        // 为null或长度为0
        if (StrUtil.isEmpty(js_code)) {
            return Result.error("参数错误！");
        }
        // 获取微信官方的 openid
        String requestUrl = "https://api.weixin.qq.com/sns/jscode2session?appid={APPID}" +
                "&secret={SECRET}&js_code={js_code}&grant_type=authorization_code ";
        String result = restTemplate.getForObject(requestUrl, String.class,
                YjyStore.appId, YjyStore.appSecret, js_code);
        log.info("结果为： " + result);
        JSONObject jsonObject = JSONUtil.parseObj(result);
        String openid = jsonObject.getStr("openid");

        // 查找是否有openid这个人
        Long userId = wxUserMapper.getUserIdByOpenid(openid);
        if (userId != null) {
            // 如果有则登录并返回凭证
            StpUtil.login(userId);
            log.info("登录成功! token信息：" + StpUtil.getTokenInfo());
            return Result.success(userId);
        }

        // 无人则建立信息,插入数据库
        // 1.生成WxUser表数据
        WxUser wxUser = new WxUser();
        // 雪花算法生成user_id
        userId = IdUtil.getSnowflakeNextId();
        wxUser.setUserId(userId);
        wxUser.setOpenid(openid);
        // 这里token由 sa-token生成，下面老方案已被注释
        // String simpleUUID = IdUtil.simpleUUID();
        // 会话登录：参数填写要登录的账号id，建议的数据类型：long | int | String， 不可以传入复杂类型，如：User、Admin 等等
        // wxUser.setToken(simpleUUID);
        LocalDateTime now = LocalDateTime.now();
        wxUser.setCreateTime(now);
        wxUserMapper.insert(wxUser);
        // 2.生成User用户资料数据
        User user = new User();
        user.setUserId(userId);
        user.setCreateTime(now);
        user.setStatus(1);
        userMapper.insert(user);
        // 注册 并 登录
        StpUtil.login(userId);
        log.info("注册并登录成功！uuid: " + userId + "生成的token信息：" + StpUtil.getTokenInfo());

        return Result.success(userId);
    }


}
